Background

Notes and format last updated Apr 9, 2020

Growth rates

Confirmed cases (total and new)

U.S.

agg.cases.US <- state.raw[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.US
agg.cases.US[, total_cases_prev3 := temp$total_cases[match(agg.cases.US$date - 3, temp$date)]]
agg.cases.US[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.US[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.US
agg.cases.US[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.US$date - 1, temp$date)]]
agg.cases.US[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.US[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.US.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = "United States",
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.US.plot

Our states

use.state <- "Washington"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

use.state <- "California"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

use.state <- "South Carolina"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

use.state <- "Tennessee"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

Deaths (total and new)

U.S.

agg.deaths.US <- state.raw[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.US
agg.deaths.US[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.US$date - 3, temp$date)]]
agg.deaths.US[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.US[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.US
agg.deaths.US[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.US$date - 1, temp$date)]]
agg.deaths.US[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.US[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.US.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = "United States",
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.US.plot

Our states

use.state <- "Washington"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

use.state <- "California"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

use.state <- "South Carolina"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]
melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

use.state <- "Tennessee"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

By population rankings

States

Total confirmed cases

Table of total confirmed cases per million residents (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
state.per.cap[, casesPerMillion := as.integer(cases/population * 1000000)]
date.cut <- max(state.per.cap$date)
state.per.cap.agg <- state.per.cap[date == date.cut]
state.per.cap.agg <- state.per.cap.agg[order(-casesPerMillion), c("state", "casesPerMillion")]
state.per.cap.agg[, casesPerMillion := comma(casesPerMillion)]
state.per.cap.agg
##                        state casesPerMillion
##  1:                 New York           7,679
##  2:               New Jersey           5,340
##  3:                Louisiana           3,663
##  4:              Connecticut           2,462
##  5:            Massachusetts           2,435
##  6:     District of Columbia           2,040
##  7:                 Michigan           2,024
##  8:             Rhode Island           1,368
##  9:             Pennsylvania           1,282
## 10:               Washington           1,194
## 11:                 Illinois           1,189
## 12:                 Delaware           1,146
## 13:                 Colorado             981
## 14:                  Vermont             969
## 15:                  Georgia             961
## 16:                 Maryland             914
## 17:                  Indiana             882
## 18:                   Nevada             752
## 19:                  Florida             730
## 20:                    Idaho             689
## 21:              Mississippi             673
## 22:                Tennessee             621
## 23:                     Utah             584
## 24:            New Hampshire             579
## 25:                 Missouri             542
## 26:                  Alabama             509
## 27:           South Carolina             495
## 28:               California             481
## 29:                Wisconsin             473
## 30:             South Dakota             444
## 31:                     Ohio             440
## 32:                 Virginia             427
## 33:               New Mexico             412
## 34:                    Maine             399
## 35:                  Wyoming             397
## 36:                 Oklahoma             385
## 37:                  Arizona             374
## 38:                     Iowa             362
## 39:                   Kansas             362
## 40:                 Arkansas             356
## 41:                    Texas             341
## 42:             North Dakota             329
## 43:           North Carolina             326
## 44:                 Kentucky             311
## 45:                  Montana             310
## 46:                   Alaska             306
## 47:                   Hawaii             305
## 48:                   Oregon             293
## 49:                 Nebraska             278
## 50:            West Virginia             269
## 51:                Minnesota             204
## 52:              Puerto Rico             194
## 53:                     Guam            <NA>
## 54: Northern Mariana Islands            <NA>
## 55:           Virgin Islands            <NA>
##                        state casesPerMillion
state.per.cap.agg[, row := .I]
top.ten <- state.per.cap.agg[row < 11, "state"]
state.per.cap.series <- state.per.cap[state %in% top.ten$state]
state.per.cap.plot <- ggplot(state.per.cap.series[date >= "2020-03-01"], aes(x = date, y = casesPerMillion, colour = state)) +
  geom_line(aes(group = state)) +
    labs(x = "Date",
       y = "Total confirmed COVID cases per million residents",
       title = "Total confirmed COVID cases per million residents",
       subtitle = paste0("States with 10 highest counts as of ", format(date.cut, "%B %d, %Y"))) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
state.per.cap.plot

New confirmed cases

Table of new cases per million residents: rolling 3-day total (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
date.cut <- max(state.per.cap$date)
date.min <- max(state.per.cap$date) - 3
state.per.cap.agg <- state.per.cap[date == date.cut]
temp <- state.per.cap[date == date.min]
state.per.cap.agg[, casesPrev3 := temp$cases[match(state.per.cap.agg$state, temp$state)]]
state.per.cap.agg[, newCasesPrev3 := (cases - casesPrev3)]
state.per.cap.agg[, casesNewPerMillion := as.integer(newCasesPrev3/population * 1000000)]
state.per.cap.agg <- state.per.cap.agg[order(-casesNewPerMillion), c("state", "casesNewPerMillion")]
state.per.cap.agg[, casesNewPerMillion := comma(casesNewPerMillion)]
state.per.cap.agg
##                        state casesNewPerMillion
##  1:                 New York              1,361
##  2:               New Jersey              1,118
##  3:              Connecticut                871
##  4:                Louisiana                864
##  5:     District of Columbia                626
##  6:            Massachusetts                622
##  7:             Rhode Island                498
##  8:                 Michigan                459
##  9:                 Delaware                454
## 10:             Pennsylvania                376
## 11:                  Georgia                326
## 12:                 Maryland                317
## 13:                 Illinois                300
## 14:                  Indiana                227
## 15:             South Dakota                172
## 16:                 Missouri                156
## 17:                  Florida                155
## 18:                  Vermont                149
## 19:               Washington                146
## 20:                   Nevada                142
## 21:                  Alabama                134
## 22:                 Colorado                122
## 23:              Mississippi                122
## 24:                 Virginia                118
## 25:               New Mexico                114
## 26:                Tennessee                103
## 27:               California                100
## 28:                   Kansas                100
## 29:           South Carolina                 97
## 30:                    Texas                 96
## 31:                     Ohio                 94
## 32:            West Virginia                 88
## 33:                     Iowa                 87
## 34:            New Hampshire                 87
## 35:                     Utah                 84
## 36:                 Nebraska                 83
## 37:                Wisconsin                 83
## 38:           North Carolina                 79
## 39:                 Kentucky                 77
## 40:                 Arkansas                 74
## 41:                    Idaho                 73
## 42:                 Oklahoma                 68
## 43:                  Arizona                 62
## 44:             North Dakota                 57
## 45:                   Alaska                 53
## 46:                  Wyoming                 51
## 47:                    Maine                 49
## 48:                   Hawaii                 45
## 49:              Puerto Rico                 45
## 50:                   Oregon                 40
## 51:                Minnesota                 38
## 52:                  Montana                 31
## 53:                     Guam               <NA>
## 54: Northern Mariana Islands               <NA>
## 55:           Virgin Islands               <NA>
##                        state casesNewPerMillion

Total deaths

Table of total deaths per million residents (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
state.per.cap[, deathsPerMillion := as.integer(deaths/population * 1000000)]
date.cut <- max(state.per.cap$date)
state.per.cap.agg <- state.per.cap[date == date.cut]
state.per.cap.agg <- state.per.cap.agg[order(-deathsPerMillion), c("state", "deathsPerMillion")]
state.per.cap.agg[, deathsPerMillion := comma(deathsPerMillion)]
state.per.cap.agg
##                        state deathsPerMillion
##  1:                 New York              322
##  2:               New Jersey              169
##  3:                Louisiana              140
##  4:                 Michigan               96
##  5:              Connecticut               93
##  6:            Massachusetts               62
##  7:               Washington               59
##  8:     District of Columbia               38
##  9:                 Illinois               36
## 10:                  Vermont               36
## 11:                  Georgia               34
## 12:                 Colorado               33
## 13:             Rhode Island               33
## 14:                  Indiana               30
## 15:                   Nevada               25
## 16:             Pennsylvania               24
## 17:              Mississippi               22
## 18:                 Maryland               20
## 19:                 Delaware               19
## 20:                 Oklahoma               19
## 21:                Wisconsin               18
## 22:                 Kentucky               16
## 23:                     Ohio               16
## 24:                  Florida               14
## 25:                 Missouri               14
## 26:                  Alabama               13
## 27:                   Kansas               13
## 28:            New Hampshire               13
## 29:               California               12
## 30:           South Carolina               12
## 31:                Tennessee               12
## 32:                  Arizona               10
## 33:                    Idaho               10
## 34:                    Maine               10
## 35:                   Oregon                9
## 36:                     Iowa                8
## 37:                 Virginia                8
## 38:                 Nebraska                7
## 39:               New Mexico                7
## 40:              Puerto Rico                7
## 41:                   Alaska                6
## 42:                Minnesota                6
## 43:             South Dakota                6
## 44:                    Texas                6
## 45:                 Arkansas                5
## 46:                  Montana                5
## 47:           North Carolina                5
## 48:             North Dakota                5
## 49:                     Utah                4
## 50:                   Hawaii                3
## 51:            West Virginia                2
## 52:                  Wyoming                0
## 53:                     Guam             <NA>
## 54: Northern Mariana Islands             <NA>
## 55:           Virgin Islands             <NA>
##                        state deathsPerMillion
state.per.cap.agg[, row := .I]
top.ten <- state.per.cap.agg[row < 11, "state"]
state.per.cap.series <- state.per.cap[state %in% top.ten$state]
state.per.cap.plot <- ggplot(state.per.cap.series[date >= "2020-03-01"], aes(x = date, y = deathsPerMillion, colour = state)) +
  geom_line(aes(group = state)) +
    labs(x = "Date",
       y = "Total COVID-related deaths per million residents",
       title = "Total COVID-related deaths per million residents",
       subtitle = paste0("States with 10 highest counts as of ", format(date.cut, "%B %d, %Y"))) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
state.per.cap.plot

New deaths

Table of new deaths per million residents: rolling 3-day total (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
date.cut <- max(state.per.cap$date)
date.min <- max(state.per.cap$date) - 3
state.per.cap.agg <- state.per.cap[date == date.cut]
temp <- state.per.cap[date == date.min]
state.per.cap.agg[, deathsPrev3 := temp$deaths[match(state.per.cap.agg$state, temp$state)]]
state.per.cap.agg[, newDeathsPrev3 := (deaths - deathsPrev3)]
state.per.cap.agg[, deathsNewPerMillion := as.integer(newDeathsPrev3/population * 1000000)]
state.per.cap.agg <- state.per.cap.agg[order(-deathsNewPerMillion), c("state", "deathsNewPerMillion")]
state.per.cap.agg[, deathsNewPerMillion := comma(deathsNewPerMillion)]
state.per.cap.agg
##                        state deathsNewPerMillion
##  1:                 New York                 108
##  2:               New Jersey                  66
##  3:              Connecticut                  40
##  4:                Louisiana                  37
##  5:                 Michigan                  34
##  6:            Massachusetts                  29
##  7:                  Georgia                  14
##  8:                 Illinois                  14
##  9:               Washington                  14
## 10:             Pennsylvania                  12
## 11:                  Indiana                  11
## 12:                   Nevada                  11
## 13:                 Colorado                   9
## 14:                 Maryland                   9
## 15:             Rhode Island                   9
## 16:              Mississippi                   8
## 17:                 Oklahoma                   8
## 18:     District of Columbia                   7
## 19:                 Kentucky                   6
## 20:            New Hampshire                   6
## 21:                     Ohio                   6
## 22:                 Delaware                   5
## 23:                    Idaho                   5
## 24:                   Kansas                   5
## 25:                 Missouri                   5
## 26:                Wisconsin                   5
## 27:                  Alabama                   4
## 28:                  Florida                   4
## 29:             South Dakota                   4
## 30:                Tennessee                   4
## 31:               California                   3
## 32:                 Nebraska                   3
## 33:           South Carolina                   3
## 34:                  Arizona                   2
## 35:                    Maine                   2
## 36:           North Carolina                   2
## 37:                   Oregon                   2
## 38:                    Texas                   2
## 39:                 Virginia                   2
## 40:                   Alaska                   1
## 41:                     Iowa                   1
## 42:                Minnesota                   1
## 43:               New Mexico                   1
## 44:             North Dakota                   1
## 45:              Puerto Rico                   1
## 46:                     Utah                   1
## 47:                  Vermont                   1
## 48:                 Arkansas                   0
## 49:                   Hawaii                   0
## 50:                  Montana                   0
## 51:            West Virginia                   0
## 52:                  Wyoming                   0
## 53:                     Guam                <NA>
## 54: Northern Mariana Islands                <NA>
## 55:           Virgin Islands                <NA>
##                        state deathsNewPerMillion
state.per.cap.agg[, row := .I]
top.ten <- state.per.cap.agg[row < 11, "state"]
state.per.cap.series <- state.per.cap[state %in% top.ten$state]
temp <- state.per.cap.series[, c("state", "date", "deaths")]
setnames(temp, "deaths", "deathsPrev3")
state.per.cap.series[, datePrev3 := date - 3]
state.per.cap.series <- merge(state.per.cap.series, temp, all.x = T, by.x = c("state", "datePrev3"), by.y = c("state", "date"))
state.per.cap.series[, newDeathsPrev3 := (deaths - deathsPrev3)]
state.per.cap.series[, deathsNewPerMillion := as.integer(newDeathsPrev3/population * 1000000)]
state.per.cap.plot <- ggplot(state.per.cap.series[date >= "2020-03-10"], aes(x = date, y = deathsNewPerMillion, colour = state)) +
  geom_line(aes(group = state)) +
    labs(x = "Date",
       y = "New COVID-related deaths per million residents",
       title = "New COVID-related deaths per million resident (3-day rolling total)",
       subtitle = paste0("States with 10 highest counts as of ", format(date.cut, "%B %d, %Y"))) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
state.per.cap.plot

Counties

Confirmed cases

Table showing total cases per million and percentile for all US counties Includes our counties and the top 5 in the US for perspective

##          county          state casesPerMillion rawRanking percentile
##  1:    Rockland       New York          19,685          1         99
##  2:      Blaine          Idaho          18,592          2         99
##  3: Westchester       New York          16,421          3         99
##  4:      Nassau       New York          13,669          4         99
##  5:    Randolph        Georgia          12,836          5         99
##  6:    Davidson      Tennessee           1,642        116         96
##  7:    Richland South Carolina             895        308         90
##  8:      Pierce     Washington             885        313         90
##  9:        York South Carolina             409        839         73
## 10:      Orange     California             320       1071         65

Our county percentiles over time

Deaths

Table showing total deaths per million and percentile for all US counties Includes our counties and the top 5 in the US for perspective

##        county          state deathsPerMillion rawRanking percentile
##  1:   Terrell        Georgia            1,055          1         99
##  2: Dougherty        Georgia              705          2         99
##  3:     Greer       Oklahoma              700          3         99
##  4:     Baker        Georgia              658          4         99
##  5:     Toole        Montana              633          5         99
##  6:  Richland South Carolina               24        425         86
##  7:  Davidson      Tennessee               19        499         84
##  8:    Pierce     Washington               18        521         83
##  9:      York South Carolina                7        737         76
## 10:    Orange     California                5        786         74

Our county percentiles over time

Raw counts

Total confirmed cases

U.S.

agg.cases.US <- state.raw[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.US.plot <- ggplot(agg.cases.US[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.US.plot

Our states

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "California"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

Our counties

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
use.county <- "Pierce"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "California"
use.county <- "Orange"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "Richland"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "York"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
use.county <- "Davidson"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

New confirmed cases

U.S.

agg.cases.US <- state.raw[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.US
agg.cases.US[, total_cases_prev := temp$total_cases[match(agg.cases.US$date - 1, temp$date)]]
agg.cases.US[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.US.plot <- ggplot(agg.cases.US[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.US.plot

Our states

use.state <- "Washington"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

use.state <- "California"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

use.state <- "South Carolina"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

use.state <- "Tennessee"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

Our counties

use.state <- "Washington"
use.county <- "Pierce"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

use.state <- "California"
use.county <- "Orange"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

use.state <- "South Carolina"
use.county <- "Richland"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

use.state <- "Tennessee"
use.county <- "Davidson"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

Total deaths

U.S.

agg.deaths.US <- state.raw[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.US.plot <- ggplot(agg.deaths.US[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.deaths.US.plot

Our states

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "California"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

Our counties

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
use.county <- "Pierce"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "California"
use.county <- "Orange"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "Richland"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "York"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
use.county <- "Davidson"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

New deaths

U.S.

agg.deaths.US <- state.raw[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.US
agg.deaths.US[, total_deaths_prev := temp$total_deaths[match(agg.deaths.US$date - 1, temp$date)]]
agg.deaths.US[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.US.plot <- ggplot(agg.deaths.US[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.deaths.US.plot

Our states

use.state <- "Washington"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

use.state <- "California"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

use.state <- "South Carolina"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

use.state <- "Tennessee"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

Our counties

use.state <- "Washington"
use.county <- "Pierce"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "California"
use.county <- "Orange"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "South Carolina"
use.county <- "Richland"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "South Carolina"
use.county <- "York"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "Tennessee"
use.county <- "Davidson"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

Stay-at-home comparisons

state.dt <- state.raw
state.dt[, stay_date := stay_dates$start_date[match(state.raw$state, stay_dates$state)]]
state.dt[, population := stay_dates$population[match(state.raw$state, stay_dates$state)]]
#state.dt[, flgOrder := ifelse(is.na(stay_date), 0, 1)]
state.dt[, flgOrder := ifelse(is.na(stay_date) | stay_date >= date, "No", "Yes")]
#state.dt[, ctDaysFromBaseline := ifelse(flgOrder == 0, as.integer(date - as.Date("2020-03-10")),
#                                         as.integer(date - stay_date))]
#state.dt[, ctDaysFromBaseline := as.integer(date - stay_date)]
temp <- state.dt
temp <- temp[, c("date", "state", "cases")]
setnames(temp, "cases", "cases_prev3")
state.dt[, dtPrev3 := date - 3]
state.dt <- merge(state.raw, temp, all.x = T, by.x = c("state", "dtPrev3"), by.y = c("state", "date"))
state.dt[, casesNewPerMillion := as.integer((cases - cases_prev3)/population * 1000000)]
state.agg.comp <- state.dt[date >= "2020-03-10" & !state %in% "Puerto Rico"]
state.agg.comp <- state.agg.comp[order(date, flgOrder),
                          .(avgNewCases = mean(casesNewPerMillion, na.rm = T),
                            cts = .N),
                           by = c("date", "flgOrder")]
state.agg.comp.plot <- ggplot(state.agg.comp, aes(x = date, y = avgNewCases, colour = as.factor(flgOrder))) +
  geom_point(aes(size = cts)) +
  geom_line(aes(group = flgOrder)) +
    labs(x = "Date",
       y = "New confirmed COVID cases per million residents",
       title = "New COVID cases vs.stay-at-home order",
       subtitle = "Average of 3-day rolling totals per million residents",
       size = "Count of states",
       colour = "Stay-at-home order") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
state.agg.comp.plot